home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / util / gnu / groff_src.lha / Groff-1.07 / tmac / tmac.e < prev    next >
Text File  |  1993-01-05  |  30KB  |  1,650 lines

  1. .\"    @(#)tmac.e    2.31 (Berkeley) 5/21/88
  2. .\"    Modified by James Clark for use with groff.
  3. .\"
  4. .\" Copyright (c) 1988 Regents of the University of California.
  5. .\" All rights reserved.
  6. .\"
  7. .\" Redistribution and use in source and binary forms are permitted
  8. .\" provided that this notice is preserved and that due credit is given
  9. .\" to the University of California at Berkeley. The name of the University
  10. .\" may not be used to endorse or promote products derived from this
  11. .\" software without specific prior written permission. This software
  12. .\" is provided ``as is'' without express or implied warranty.
  13. .\"    %beginstrip%
  14. .\"
  15. .\"**********************************************************************
  16. .\"*                                    *
  17. .\"*    ******  - M E   N R O F F / T R O F F   M A C R O S  ******    *
  18. .\"*                                    *
  19. .\"*    Produced for your edification and enjoyment by:            *
  20. .\"*        Eric Allman                        *
  21. .\"*        Electronics Research Laboratory                *
  22. .\"*        U.C. Berkeley.                        *
  23. .\"*    current address:                        *
  24. .\"*        Britton-Lee, Inc.                    *
  25. .\"*        1919 Addison Street Suite 105                *
  26. .\"*        Berkeley, California  94704                *
  27. .\"*                                    *
  28. .\"*    VERSION 2.31    First Release: 11 Sept 1978            *
  29. .\"*                                    *
  30. .\"*    Documentation is available.                    *
  31. .\"*                                    *
  32. .\"**********************************************************************
  33. .\"
  34. .\"    Code on .de commands:
  35. .\"        ***    a user interface macro.
  36. .\"        &&&    a user interface macro which is redefined
  37. .\"            when used to be the real thing.
  38. .\"        $$$    a macro which may be redefined by the user
  39. .\"            to provide variant functions.
  40. .\"        ---    an internal macro.
  41. .\"
  42. .if !\n(.g .ig
  43. .de @R            \" --- initialize number register to 0, if undefined
  44. .if !r\\$1 .nr \\$1 0
  45. ..
  46. .@R pf
  47. .if \n(pf .nx
  48. .if !\n(.g .ig
  49. .de @S            \" --- initialize string/macro to empty, if undefined
  50. .if !d\\$1 .ds \\$1 \" empty
  51. ..
  52. .@R @\"            \" debugging level
  53. .\"        *** INTERNAL GP MACROS ***
  54. .de @C            \" --- change ev's, taking info with us
  55. .nr _S \\n(.s
  56. .nr _V \\n(.v
  57. .nr _F \\n(.f
  58. .do ds _A \\n[.fam]
  59. .nr _I \\n(.i
  60. .ev \\$1
  61. .ps \\n(_S
  62. .vs \\n(_Vu
  63. .ft \\n(_F
  64. .do @fam \\*(_A
  65. 'in \\n(_Iu
  66. .xl \\n($lu
  67. .lt \\n($lu
  68. .rr _S
  69. .rr _V
  70. .rr _F
  71. .rr _I
  72. .ls 1
  73. 'ce 0
  74. ..
  75. .de @D            \" --- determine display type (Indent, Left, Center)
  76. .ds |p "\\$3
  77. .nr _d 0
  78. .if "\\$2"C" \
  79. .    nr _d 1
  80. .if "\\$2"L" \
  81. .    nr _d 2
  82. .if "\\$2"I" \
  83. .    nr _d 3
  84. .if "\\$2"M" \
  85. .    nr _d 4
  86. .if !\\n(_d \{\
  87. .    nr _d \\$1
  88. .    ds |p "\\$2
  89. .\}
  90. ..
  91. .de @z            \" --- end macro
  92. .if \n@>1 .tm >> @z, .z=\\n(.z ?a=\\n(?a
  93. .if !"\\n(.z"" \
  94. \{\
  95. .    tm Line \\n(c. -- Unclosed block, footnote, or other diversion (\\n(.z)
  96. .    di
  97. .    ex
  98. .\}
  99. .if \\n(?a \
  100. .    bp            \" force out final table
  101. .ds bp
  102. .ds @b\"            \" don't start another page
  103. .br
  104. .if \n@>1 .tm << @z
  105. ..
  106. .\"        *** STANDARD HEADERS AND FOOTERS ***
  107. .ie \n(.g .ds $* \\\\$*
  108. .el .ds $* \\\\$1 \\\\$2 \\\\$3 \\\\$4 \\\\$5 \\\\$6 \\\\$7 \\\\$8 \\\\$9
  109. .de he            \" *** define header
  110. .ie !\\n(.$ \
  111. \{\
  112. .    rm |4
  113. .    rm |5
  114. .\}
  115. .el \
  116. \{\
  117. .    ds |4 "\*($*
  118. .    ds |5 "\*($*
  119. .\}
  120. ..
  121. .de eh            \" *** define even header
  122. .ie !\\n(.$ \
  123. .    rm |4
  124. .el \
  125. .    ds |4 "\*($*
  126. ..
  127. .de oh            \" *** define odd header
  128. .ie !\\n(.$ \
  129. .    rm |5
  130. .el \
  131. .    ds |5 "\*($*
  132. ..
  133. .de fo            \" *** define footer
  134. .ie !\\n(.$ \
  135. \{\
  136. .    rm |6
  137. .    rm |7
  138. .\}
  139. .el \
  140. \{\
  141. .    ds |6 "\*($*
  142. .    ds |7 "\*($*
  143. .\}
  144. ..
  145. .de ef            \" *** define even foot
  146. .ie !\\n(.$ \
  147. .    rm |6
  148. .el \
  149. .    ds |6 "\*($*
  150. ..
  151. .de of            \" *** define odd footer
  152. .ie !\\n(.$ \
  153. .    rm |7
  154. .el \
  155. .    ds |7 "\*($*
  156. ..
  157. .de ep            \" *** end page (must always be followed by a .bp)
  158. .if \\n(nl>0 \
  159. \{\
  160. .    wh 0
  161. .    rs
  162. .    @b
  163. .\}
  164. ..
  165. .\"        *** INTERNAL HEADER AND FOOTER MACROS ***
  166. .de @h            \" --- header
  167. .if \n@>1 .tm >> @h %=\\n% ?a=\\n(?a ?b=\\n(?b ?w=\\n(?w
  168. .if (\\n(.i+\\n(.o)>=\\n(.l \
  169. .    tm Line \\n(c. -- Offset + indent exceeds line length
  170. .\" initialize a pile of junk
  171. .nr ?h \\n(?H            \" transfer "next page" to "this page"
  172. .nr ?H 0
  173. .nr ?c \\n(?C
  174. .nr ?C 0
  175. .rn |4 |0
  176. .rn |5 |1
  177. .rn |6 |2
  178. .rn |7 |3
  179. .nr _w 0            \" reset max footnote width
  180. .nr ?W 0            \" no wide floats this page (yet)
  181. .nr ?I 1
  182. .\" begin actual header stuff
  183. .ev 2
  184. .rs
  185. .if \\n(hm>0 \
  186. .    sp |\\n(hmu        \" move to header position
  187. .@t $h                \" output header title
  188. .if \\n(tm<=0 \
  189. .    nr tm \n(.Vu
  190. .sp |\\n(tmu            \" move to top of text
  191. .ev
  192. .mk _k                \" for columned output
  193. .if \\n(?n .nm 1        \" restore line numbering if n1 mode
  194. .nr $c 1            \" set first column
  195. .if \n@>4 .tm -- @h >> .ns nl=\\n(nl %=\\n% _k=\\n(_k tm=\\n(tm
  196. .ie \\n(?s \
  197. \{\
  198. .    nr ?s 0
  199. .    rs
  200. '    @b
  201. .\}
  202. .el \
  203. .    @n            \" begin the column
  204. .if \n@>2 .tm << @h
  205. ..
  206. .de @n            \" --- new column or page
  207. .if \n@>3 .tm >> @n nl=\\n(nl %=\\n% ?f=\\n(?f ?o=\\n(?o
  208. .if \\n(bm<=0 \
  209. .    nr bm \\n(.Vu
  210. .if (\\n(_w<=\\n($l)&(\\n(?W=0) \
  211. \{\
  212. .    nr _b (\\n(ppp*\\n($vu)/200u    \" compute fudge factor (must be < 1P)
  213. .    if \\n(_bu>((\\n(bmu-\\n(fmu-((\\n(tpp*\\n($vu)/100u))/2u) \
  214. .        nr _b (\\n(ppp*\\n($vu)/100u-\n(.Vu
  215. .    nr _b +\\n(bmu
  216. .\}
  217. .nr _B \\n(_bu
  218. .ch @f
  219. .wh -\\n(_bu @f
  220. .nr _b +(\\n(ppp*\\n($vu)/100u \" add 1 paragraph v in case of sweep past
  221. .if \n@>2 .tm @n .p=\\n(.p bm=\\n(bm _b=\\n(_b _B=\\n(_B
  222. .nr ?f 0            \" reset footnote flag
  223. .if \\n(?o \
  224. \{\
  225. .    (f _            \" reprocess footnotes which run off page
  226. .    nf
  227. .    |o
  228. .    fi
  229. .    )f
  230. .    rm |o
  231. .\}
  232. .nr ?o 0
  233. .if \\n(?T \
  234. \{\
  235. .    nr _i \\n(.i
  236. .    in \\n($iu
  237. .    |h            \" output the table header
  238. .    in \\n(_iu
  239. .    rr _i
  240. .    mk #T            \" for tbl commands
  241. .    ns
  242. .\}
  243. .if (\\n(?a)&((\\n($c<2):(\\n(?w=0)) \
  244. \{\
  245. .    nr ?a 0            \" output floating keep
  246. .    @k |t
  247. .    if \\n(?w \
  248. .        mk _k        \" don't overstrike wide keeps
  249. .    nr ?w 0
  250. .\}
  251. .os
  252. .$H                \" special column header macro
  253. .ns
  254. ..
  255. .de @f            \" --- footer
  256. .if \n@>1 .tm >> @f %=\\n% nl=\\n(nl ?a=\\n(?a ?b=\\n(?b ?f=\\n(?f
  257. .if \n@>2 .nr VL \\n(.pu-\\n(nlu
  258. .if \n@>2 .tm @f bm=\\n(bm _B=\\n(_B _b=\\n(_b .p-nl=\\n(VL
  259. .ec
  260. .if \\n(?T \
  261. \{\
  262. .    nr T. 1            \" for tbl commands (to output bottom line)
  263. .    T# 1            \" output the sides and bottom lines
  264. .    br
  265. .\}
  266. .ev 2
  267. .ce 0
  268. .if \\n(?b \
  269. \{\
  270. .    nr ?b 0
  271. .    @k |b\"            \" output bottom of page tables
  272. .\}
  273. .if \\n(?f \
  274. .    @o            \" output footnote if present
  275. .ie \\n($c<\\n($m \
  276. .    @c            \" handle new column
  277. .el \
  278. .    @e            \" new page
  279. .ev
  280. .if \n@>2 .tm << @f
  281. ..
  282. .de @o            \" --- output footnote
  283. .nf
  284. .ls 1
  285. .in 0
  286. .if \n@>2 .tm @o last printed text = \\n(nl placing @r trap at -\\n(_B
  287. .wh -\\n(_Bu @r
  288. .|f
  289. .fi
  290. .if \n@>2 .tm @o triggered @r (?o) = \\n(?o
  291. .if \\n(?o \
  292. \{\
  293. .    di            \" just in case triggered @r
  294. .    if \\n(dn=0 \
  295. \{\
  296. .        rm |o
  297. .        nr ?o 0
  298. .    \}
  299. .    nr dn \\n(_D
  300. .    rr _D
  301. .\}
  302. .rm |f
  303. .ch @r
  304. ..
  305. .de @c            \" --- new column
  306. .if \n@>2 .tm    >> @c %=\\n%
  307. .rs
  308. .sp |\\n(_ku
  309. .@O +\\n($lu+\\n($su
  310. .nr $c +1
  311. .@n
  312. ..
  313. .de @e            \" --- end page
  314. .if \n@>2 .tm    >> @e
  315. .@O \\n(_ou
  316. .rs
  317. .sp |\\n(.pu-\\n(fmu-((\\n(tpp*\\n($vu)/100u)    \" move to footer position
  318. .@t $f                \" output footer title
  319. .nr ?h 0
  320. .bp
  321. ..
  322. .de @t            \" --- output header or footer title
  323. .if !\\n(?h \
  324. \{\
  325. .    sz \\n(tp        \" set header/footer type fonts, etc.
  326. .    @F \\n(tf
  327. .    lt \\n(_Lu        \" make title span entire page
  328. .    nf
  329. .    \\$1
  330. .    br
  331. .\}
  332. ..
  333. .de $h            \" $$$ print header
  334. .ds |z
  335. .if !\\n(?c \
  336. \{\
  337. .    if e .ds |z "\\*(|0
  338. .    if o .ds |z "\\*(|1
  339. .\}
  340. .if !\(ts\\*(|z\(ts\(ts \
  341. '    tl \\*(|z
  342. .rm |z
  343. ..
  344. .de $f            \" $$$ print footer
  345. .ds |z
  346. .if \\n(?c \
  347. \{\
  348. .    if e .ds |z "\\*(|0
  349. .    if o .ds |z "\\*(|1
  350. .\}
  351. .if \(ts\\*(|z\(ts\(ts \
  352. \{\
  353. .    if e .ds |z "\\*(|2
  354. .    if o .ds |z "\\*(|3
  355. .\}
  356. .if !\(ts\\*(|z\(ts\(ts \
  357. '    tl \\*(|z
  358. .rm |z
  359. ..
  360. .de @r            \" --- reprocess overflow footnotes
  361. .if \n@>3 .tm        >> @r .z=\\n(.z ?f=\\n(?f ?a=\\n(?a ?b=\\n(?b _b=\\n(_b
  362. .di |o                \" save overflow footnote
  363. .nr ?o 1
  364. .nr _D \\n(dn
  365. .ns
  366. ..
  367. .\"        *** COMMANDS WITH VARIANT DEFINITIONS ***
  368. .rn bp @b        \" --- begin page
  369. .de bp            \" *** begin new page (overrides columns)
  370. .nr $c \\n($m            \" force new page, not new column
  371. .ie \\n(nl>0 \
  372. .    @b \\$1
  373. .el \
  374. \{\
  375. .    if \\n(.$>0 \
  376. .        pn \\$1
  377. .    if \\n(?I \
  378. .        @h        \" 'spring' the header trap
  379. .\}
  380. .br
  381. .wh 0 @h            \" reset header
  382. ..
  383. .rn ll xl        \" *** special line length (local)
  384. .de ll            \" *** line length (global to environments)
  385. .xl \\$1
  386. .lt \\$1
  387. .nr $l \\n(.l
  388. .if (\\n($m<=1):(\\n($l>\\n(_L) \
  389. .    nr _L \\n(.l
  390. ..
  391. .rn po @O        \" --- local page offset
  392. .de po            \" *** page offset
  393. .@O \\$1
  394. .nr _o \\n(.o
  395. ..
  396. .\" Redefine the fam request to set the family in
  397. .\" environment 2 as well as the current environment.
  398. .if !\n(.g .ig
  399. .do rn fam @fam        \" --- set family in current environment
  400. .do de fam        \" *** set font family in ev 2 and current ev
  401. .do @fam \\$1
  402. .ev 2
  403. .do @fam \\$1
  404. .ev
  405. ..
  406. .\"        *** MISCELLANEOUS ROFF COMMANDS ***
  407. .de hx            \" *** suppress headers and footers next page
  408. .nr ?H 1
  409. ..
  410. .de ix            \" *** indent, no break
  411. 'in \\$1
  412. ..
  413. .de bl            \" *** contiguous blank lines
  414. .br
  415. .ne \\$1
  416. .rs
  417. .sp \\$1
  418. ..
  419. .de n1            \" *** line numbering 1
  420. .nm 1
  421. .xl -\w'0000'u
  422. .nr ?n 1
  423. ..
  424. .de n2            \" *** line numbering 2
  425. .nm \\$1
  426. .ie \\n(.$ \
  427. .    xl -\w'0000'u
  428. .el \
  429. .    xl \\n($lu
  430. ..
  431. .de pa            \" *** new page
  432. .bp \\$1
  433. ..
  434. .de ro            \" *** roman page numbers
  435. .af % i
  436. ..
  437. .de ar            \" *** arabic page numbers
  438. .af % 1
  439. ..
  440. .de m1            \" *** position one space
  441. .nr _0 \\n(hmu
  442. .nr hm \\$1v
  443. .nr tm +\\n(hmu-\\n(_0u
  444. .rr _0
  445. ..
  446. .de m2            \" *** position two space
  447. .nr tm \\n(hmu+\\n(tpp+\\$1v
  448. ..
  449. .de m3            \" *** position three space
  450. .nr bm \\n(fmu+\\n(tpp+\\$1v
  451. ..
  452. .de m4            \" *** position four space
  453. .nr _0 \\n(fmu
  454. .nr fm \\$1v
  455. .nr bm +\\n(fmu-\\n(_0u
  456. ..
  457. .de sk            \" *** leave a blank page (next page)
  458. .if \\n(.$>0 \
  459. .    tm Line \\n(c. -- I cannot skip multiple pages
  460. .nr ?s 1
  461. ..
  462. .\"        *** MISCELLANEOUS USER SUPPORT COMMANDS ***
  463. .if !\n(.g .ig
  464. .de re            \" *** reset tabs (TROFF defines 15 stops default)
  465. .ta T 0.5i
  466. ..
  467. .if \n(.g .ig
  468. .de re
  469. .ta 0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i
  470. ..
  471. .de ba            \" *** set base indent
  472. .ie \\n(.$ \
  473. .    nr $i \\$1n
  474. .el \
  475. .    nr $i \\n(siu*\\n($0u
  476. ..
  477. .de hl            \" *** draw horizontal line
  478. .br
  479. \l'\\n(.lu-\\n(.iu'
  480. .sp
  481. ..
  482. .\"        *** PARAGRAPHING ***
  483. .de pp            \" *** paragraph
  484. .lp \\n(piu
  485. ..
  486. .de lp            \" *** left aligned paragraph
  487. .@p
  488. .if \\n(.$ \
  489. .    ti +\\$1
  490. .nr $p 0 1
  491. ..
  492. .de ip            \" *** indented paragraph w/ optional tag
  493. .if (\\n(ii>0)&(\\n(ii<1n) \
  494. .    nr ii \\n(iin
  495. .nr _0 \\n(ii
  496. .if \\n(.$>1 \
  497. .    nr _0 \\$2n
  498. .@p \\n(_0u
  499. .if \\w"\\$1" \
  500. \{\
  501. .    ti -\\n(_0u
  502. .    ie \\w"\\$1">=\\n(_0 \
  503. \{\
  504. \&\\$1
  505. .        br
  506. .    \}
  507. .    el \&\\$1\h'|\\n(_0u'\c
  508. .\}
  509. .rr _0
  510. ..
  511. .de np            \" *** numbered paragraph
  512. .\" use string comparison in case user has changed format of $p
  513. .if '\\n($p'-1' \
  514. .    nr $p 0            \" reset number after .bu
  515. .nr $p +1            \" increment paragraph number
  516. .@p \w'\0(000)\0'u
  517. .ti -\w'\0(000)\0'u
  518. \0(\\n($p)\h'|\w'\0(000)\0'u'\c
  519. ..
  520. .de bu            \" *** bulleted paragraph
  521. .br
  522. .\" use string comparison in case user has changed format of $p
  523. .if '\\n($p'-1' \
  524. .    ns            \" don't space between .bu paragraphs
  525. .nr $p 0-1            \" mark "bulleted paragraph" mode
  526. .@p \w'\0\(bu\0'u
  527. .ti -\w'\0\(bu\0'u
  528. \0\(bu\0\c
  529. ..
  530. .de @p            \" --- initialize for paragraph
  531. .if "\\n(.z"|e" .tm Line \\n(c. -- Unmatched continued equation
  532. .in \\n($iu+\\n(pou
  533. .if \\n(.$ \
  534. .    in +\\$1n
  535. .ce 0
  536. .fi
  537. .@F \\n(pf
  538. .sz \\n(pp
  539. .sp \\n(psu
  540. .ne \\n(.Lv+\\n(.Vu
  541. .ns
  542. ..
  543. .\"        *** SECTION HEADINGS ***
  544. .de sh            \" *** section heading
  545. .fi
  546. .if (\\n(si>0)&(\\n(si<1n) \
  547. .    nr si \\n(sin
  548. .ce 0
  549. .@d "\\$1" +1 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
  550. .if !"\\$2"_" \
  551. \{\
  552. .    ds |n \&\\$2
  553. .    $p "\\*(|n" "\\*($n" \\n($0
  554. .    $0 "\\*(|n" "\\*($n" \\n($0
  555. .    rm |n
  556. .\}
  557. .nr $p 0 1            \" reset .np count
  558. ..
  559. .de @d            \" --- change section depth
  560. .if !""\\$1" \
  561. .    nr $0 \\$1
  562. .if \\n($0&(\\n(.$>1) \
  563. .    nr $\\n($0 \\$2
  564. .ds $n \&\"
  565. .ie \\n($0>=1 \
  566. \{\
  567. .    if '\\n($1'0' \
  568. .        nr $1 1
  569. .    if (\\n(.$>=3) .if !"\\$3"-" \
  570. .        nr $1 \\$3
  571. .    as $n \\n($1
  572. .\}
  573. .el \
  574. .    nr $1 0
  575. .ie \\n($0>=2 \
  576. \{\
  577. .    if '\\n($2'0' \
  578. .        nr $2 1
  579. .    if (\\n(.$>=4) .if !"\\$4"-" \
  580. .        nr $2 \\$4
  581. .    as $n .\\n($2
  582. .\}
  583. .el \
  584. .    nr $2 0
  585. .ie \\n($0>=3 \
  586. \{\
  587. .    if '\\n($3'0' \
  588. .        nr $3 1
  589. .    if (\\n(.$>=5) .if !"\\$5"-" \
  590. .        nr $3 \\$5
  591. .    as $n .\\n($3
  592. .\}
  593. .el \
  594. .    nr $3 0
  595. .ie \\n($0>=4 \
  596. \{\
  597. .    if '\\n($4'0' \
  598. .        nr $4 1
  599. .    if (\\n(.$>=6) .if !"\\$6"-" \
  600. .        nr $4 \\$6
  601. .    as $n .\\n($4
  602. .\}
  603. .el \
  604. .    nr $4 0
  605. .ie \\n($0>=5 \
  606. \{\
  607. .    if '\\n($5'0' \
  608. .        nr $5 1
  609. .    if (\\n(.$>=7) .if !"\\$7"-" \
  610. .        nr $5 \\$7
  611. .    as $n .\\n($5
  612. .\}
  613. .el \
  614. .    nr $5 0
  615. .ie \\n($0>=6 \
  616. \{\
  617. .    if '\\n($6'0' \
  618. .        nr $6 1
  619. .    if (\\n(.$>=8) .if !"\\$8"-" \
  620. .        nr $6 \\$8
  621. .    as $n .\\n($6
  622. .\}
  623. .el \
  624. .    nr $6 0
  625. ..
  626. .de sx            \" *** heading up, no increment (2.1.1 -> 2.1)
  627. .ce 0
  628. .ul 0
  629. .nr _0 \\n($0-1
  630. .if \\n(.$ .nr _0 +1
  631. .if \\n(.$ .nr _0 \\$1
  632. .@d \\n(_0
  633. .rr _0
  634. .$p "" "" \\n($0
  635. .nr $p 0 1            \" reset .np count
  636. ..
  637. .de uh            \" *** unnumbered section heading
  638. .$p "\\$1"
  639. .$0 "\\$1"
  640. ..
  641. .de $p            \" $$$ print section heading
  642. .if (\\n(si>0)&(\\n(.$>2) \
  643. .    nr $i \\$3*\\n(si
  644. .in \\n($iu
  645. .ie !"\\$1\\$2"" \
  646. \{\
  647. .    sp \\n(ssu         \" one of them is non-null
  648. .    ne \\n(.Lv+\\n(.Vu+\\n(psu+((\\n(spp*\\n($vu*\\n(.Lu)/100u)
  649. .    \" exdent if \\$3 > 0
  650. .    ie 0\\$3 \
  651. .        ti -(\\n(siu-\\n(sou)
  652. .    el \
  653. .        ti +\\n(sou
  654. .    @F \\n(sf
  655. .    sz \\n(sp
  656. .    if \\$3>0 \
  657. .        $\\$3
  658. .    if \w"\\$2">0 \\$2.
  659. .    if \w"\\$1">0 \\$1\f1\ \ \&
  660. .\}
  661. .el \
  662. .    sp \\n(psu
  663. .@F \\n(pf
  664. .sz \\n(pp
  665. ..
  666. .\"        *** COLUMNNED OUTPUT ***
  667. .de 2c            \" *** double columned output
  668. .br
  669. .if \\n($m>1 \
  670. .    1c            \" revert to 1c if already 2c
  671. .nr $c 1
  672. .nr $m 2
  673. .if \\n(.$>1 \
  674. .    nr $m \\$2
  675. .if \\n(.$>0 \
  676. .    nr $s \\$1n        \" param 1: column seperation
  677. .nr $l (\\n(.l-((\\n($m-1)*\\n($s))/\\n($m
  678. .xl \\n($lu
  679. .mk _k
  680. .ns
  681. ..
  682. .de 1c            \" *** single columned output
  683. .br
  684. .nr $c 1
  685. .nr $m 1
  686. .ll \\n(_Lu            \" return to normal output
  687. .sp |\\n(.hu
  688. .@O \\n(_ou
  689. ..
  690. .de bc            \" *** begin column
  691. .sp 24i
  692. ..
  693. .\"        *** FLOATING TABLES AND NONFLOATING BLOCKS ***
  694. .de (z            \" *** begin floating keep
  695. .if \n@>4 .tm >> (z, .z=\n(.z
  696. .@D 4 \\$1 \\$2
  697. .@(
  698. .nr ?T 0
  699. ..
  700. .de )z            \" *** end floating keep
  701. .if \n@>4 .tm >> )z, .z=\n(.z
  702. .sp \\n(zsu
  703. .@)
  704. .if \n@>4 .tm -- )z << @), .z=\n(.z
  705. .rr _0
  706. .if !\\n(?b \
  707. .    nr dn +(\\n(ppp*\\n($vu)/200u+\\n(zsu
  708. .nr dl -\n(.H            \" fudge factor necessary to make it work
  709. .ie ((\\n(dn+\n(.V)>=\\n(.t):(\\n(?a):((\\n(dl>\\n($l)&(\\n($c>1)) \
  710. \{\
  711. .    nr ?a 1
  712. .    if (\\n(dl>\\n($l)&(\\n($m>1) \
  713. .        nr ?w 1        \" mark wider than one column (top)
  714. .    ds |x |t
  715. .\}
  716. .el \
  717. \{\
  718. .    nr ?b 1
  719. .    if (\\n(dl>\\n($l)&(\\n($m>1) \
  720. .        nr ?W 1        \" mark wider than one column (bottom)
  721. .    nr _b +\\n(dnu
  722. .    \" avoid moving @f back past the current position
  723. .    if \\n(.p-\\n(nl-\n(.V<\\n(_b \
  724. .        nr _b \\n(.p-\\n(nl-\n(.V
  725. .    ch @f -\\n(_bu
  726. .    ds |x |b
  727. .\}
  728. .da \\*(|x            \" copy to save macro
  729. .nf
  730. .ls 1
  731. .nr ?k 1
  732. .if \n@>4 .tm -- )z >> \\*(|x
  733. \!.if \\\\n(nl>(\\\\n(tm+2v) .ne \\n(dnu-\\n(zsu
  734. .|k\"                \" and the body
  735. .ec
  736. .if \n@>4 .tm -- )z << \\*(|x, .z=\\n(.z
  737. .nr ?k 0
  738. .rm |k\"            \" remove the temp macro
  739. .da
  740. .in 0
  741. .ls 1
  742. .xl \\n($lu
  743. .ev
  744. .if \n@>4 .tm << )z, .z=\\n(.z
  745. ..
  746. .de @k            \" --- output floating keep
  747. .if \n@>4 .tm >> @k, $1=\\$1, .z=\\n(.z
  748. .ev 1
  749. .nf
  750. .ls 1
  751. .in 0
  752. .sp \\n(zsu
  753. .\\$1
  754. .ec
  755. .br
  756. .rm \\$1
  757. .ev
  758. .nr ?T 0
  759. ..
  760. .de (t            \" XXX temp ref to (z
  761. .(z \\$1 \\$2
  762. ..
  763. .de )t            \" XXX temp ref to )t
  764. .)z \\$1 \\$2
  765. ..
  766. .de (b            \" *** begin block
  767. .br
  768. .@D 3 \\$1 \\$2
  769. .sp \\n(bsu
  770. .@(
  771. ..
  772. .de )b            \" *** end block
  773. .br
  774. .@)
  775. .if (\\n(bt=0):(\\n(.t<\\n(bt) \
  776. .    ne \\n(dnu        \" make it all on one page
  777. .ls 1
  778. .nf
  779. .|k
  780. .ec
  781. .fi
  782. .in 0
  783. .xl \\n($lu
  784. .ev
  785. .rm |k
  786. .sp \\n(bsu+\\n(.Lv-1v
  787. ..
  788. .de @(            \" --- begin keep
  789. .if !"\\n(.z"" .tm Line \\n(c. -- Illegal nested keep \\n(.z
  790. .@M
  791. .di |k
  792. \!'rs
  793. ..
  794. .de @M            \" --- set modes for display
  795. .nr ?k 1
  796. .@C 1
  797. .@F \\n(df
  798. .if \\n($R .@V
  799. .vs \\n(.sp*\\n($Vu/100u
  800. .nf
  801. .if "\\*(|p"F" \
  802. .    fi            \" set fill mode if "F" parameter
  803. .if \\n(_d=4 \
  804. .    in 0
  805. .if \\n(_d=3 \
  806. \{\
  807. .    in +\\n(biu
  808. .    xl -\\n(biu
  809. .\}
  810. .if \\n(_d=1 \
  811. .    ce 10000
  812. ..
  813. .de @)            \" --- end keep
  814. .br
  815. .if !"\\n(.z"|k" .tm Line \\n(c. -- Close of a keep which has never been opened
  816. .nr ?k 0
  817. .di
  818. .in 0
  819. .ce 0
  820. ..
  821. .de (c            \" *** begin block centered text
  822. .if "\\n(.z"|c" .tm Line \\n(c. -- Nested .(c requests
  823. .di |c
  824. ..
  825. .de )c            \" *** end block centered text
  826. .if !"\\n(.z"|c" .tm Line \\n(c. -- Unmatched .)c
  827. .br                \" force out final line
  828. .di
  829. .if \n@>4 .tm >> .)c .l=\\n(.l .i=\\n(.i $i=\\n($i dl=\\n(dl
  830. .ev 1
  831. .ls 1
  832. .in (\\n(.lu-\\n(.iu-\\n(dlu)/2u
  833. .if \n@>4 .tm -- .)c << .in .l=\\n(.l .i=\\n(.i dl=\\n(dl
  834. .nf
  835. .|c
  836. .ec
  837. .in
  838. .ls
  839. .ev
  840. .rm |c
  841. ..
  842. .\"        *** BLOCK QUOTES (OR WHATEVER) AND LISTS ***
  843. .de (q            \" *** begin block quote
  844. .br
  845. .@C 1
  846. .fi
  847. .sp \\n(qsu
  848. .in +\\n(qiu
  849. .xl -\\n(qiu
  850. .sz \\n(qp
  851. ..
  852. .de )q            \" *** end block quote
  853. .br
  854. .ev
  855. .sp \\n(qsu+\\n(.Lv-1v
  856. .nr ?k 0
  857. ..
  858. .de (l            \" *** begin list
  859. .br
  860. .sp \\n(bsu
  861. .@D 3 \\$1 \\$2
  862. .@M
  863. ..
  864. .de )l            \" *** end list
  865. .br
  866. .ev
  867. .sp \\n(bsu+\\n(.Lv-1v
  868. .nr ?k 0
  869. ..
  870. .\"        *** PREPROCESSOR SUPPORT ***
  871. .\"
  872. .\"    EQN
  873. .\"
  874. .de EQ            \" *** equation start
  875. .ec
  876. .if !\\n(?e \
  877. \{\
  878. .    if "\\n(.z"|e" .tm Line \\n(c. -- Nested .EQ request
  879. .    @D 1 "\\$1" "\\$2"
  880. .    @C 2
  881. .    di |e
  882. .\}
  883. .ls 1
  884. .in 0
  885. .nf
  886. ..
  887. .de EN            \" *** equation end
  888. .br
  889. .ie "\\$1"C" \
  890. \{\
  891. .    nr ?e 1
  892. .    sp \\n(esu
  893. .\}
  894. .el \
  895. \{\
  896. .    nr ?e 0
  897. .    di
  898. .    if \\n(dn \
  899. .        @q        \" actual equation output
  900. .    rm |e
  901. .    ev
  902. .\}
  903. ..
  904. .de @q            \" --- equation output
  905. .nr _Q \\n(dnu
  906. .ev
  907. .sp \\n(esu            \" output rest of preceeding text
  908. .if !"\\n(.z"" \!.ne \\n(_Qu
  909. .ne \\n(_Qu+\n(.Vu        \" keep it on one page
  910. .@C 2                \" .ev 2 may be jumbled from header
  911. .if \\n(_d=1 \
  912. .    in (\\n(.lu+\\n($iu-\\n(dlu)/2u
  913. .if \\n(_d=2 \
  914. .    in \\n($iu
  915. .if \\n(_d=3 \
  916. .    in \\n(biu+\\n($iu
  917. .if \\n(_d=4 \
  918. .    in 0
  919. .mk _q
  920. .if \n@>1 .tm --@e: _Q=\\n(_Q _q=\\n(_q nl=\\n(nl |p=\\*(|p
  921. .if !"\\*(|p"" \
  922. \{\
  923. .    rs
  924. .    sp (\\n(_Qu-\\n(.vu)/2u
  925. .    tl """\\*(|p"
  926. .    rt \\n(_qu
  927. .\}
  928. .|e
  929. .sp |\\n(_qu+\\n(_Qu
  930. .sp \\n(esu+\\n(.Lv-1v
  931. .rr _q
  932. .rr _Q
  933. ..
  934. .\"
  935. .\"    TBL
  936. .\"
  937. .de TS            \" *** table start
  938. .sp \\n(bsu
  939. .@C 1
  940. .fi                \" drop into fill mode for text boxes
  941. .if "\\$1"H" \
  942. \{\
  943. .    di |h            \" save header part
  944. .    nr ?T 1
  945. .\}
  946. .ls 1
  947. .ch @f -(\\n(_bu+1v)        \" set pseudo-trap for bottom line
  948. .if \\n(.p-\\n(_b-1v<=\\n(nl \
  949. .    ch @f \\n(nlu+\n(.Vu
  950. ..
  951. .de TH            \" *** end header part of table
  952. .nr T. 0
  953. .T# 0
  954. .di
  955. .nr _T \\n(?T
  956. .nr ?T 0
  957. .ne \\n(dnu+1v
  958. .nr ?T \\n(_T
  959. .nr _i \\n(.i
  960. .in 0
  961. .|h                \" put in the initial header
  962. .in \\n(_iu
  963. .rr _i
  964. .mk #T
  965. ..
  966. .de TE            \" *** table end
  967. .nr ?T 0
  968. .ch @f -\\n(_bu            \" reset pseudo-trap
  969. .if \\n(.p-\\n(_b<=\\n(nl \
  970. .    ch @f \\n(nlu+\n(.Vu
  971. .ev
  972. .sp \\n(bsu+\\n(.Lv-1v
  973. .re
  974. ..
  975. .\"
  976. .\"    REFER
  977. .\"
  978. .de ][                \" *** refer output
  979. .if \\$1>5 .tm Bad arg to []
  980. .[\\$1
  981. ..
  982. .de [0                \" --- other
  983. .(f
  984. .ip "\\*([F.\0"
  985. .if !"\\*([A"" \\*([A,
  986. .if !"\\*([T"" \\f2\\*([T\\f1\c
  987. .if !"\\*([T"" .if !"\\*([O"" ,\ 
  988. .ie !"\\*([O"" \\*([O
  989. .el .if !"\\*([T"" \&.
  990. .if !"\\*([D"" \\*([D.
  991. .@p
  992. .)f
  993. ..
  994. .de [1                \" --- journal article
  995. .(f
  996. .ip "\\*([F.\0"
  997. \\*([A,
  998. .if !"\\*([T"" \\*(lq\\*([T,\\*(rq
  999. .if "\\*([V"" \\f2\\*([J\\f1,
  1000. .if !"\\*([V"" \\f2\\*([J\\f1
  1001. .if !"\\*([V"" \\f3\\*([V\\f1\c
  1002. .if !"\\*([N"" (\\*([N)\c
  1003. .if !"\\*([P"" \
  1004. \{\
  1005. .    ie \\n([P>0 \ pp.\&
  1006. .    el \ p.\&
  1007. \\*([P
  1008. .\}
  1009. .if !"\\*([I"" .if "\\*([R"" \\*([I,
  1010. (\\*([D).
  1011. .if !"\\*([O"" \\*([O
  1012. .)f
  1013. ..
  1014. .de [2                \" --- book
  1015. .(f
  1016. .ip "\\*([F.\0"
  1017. \\*([A, \\f2\\*([T,\\f1
  1018. \\*([I\c
  1019. .if !"\\*([C"" , \\*([C\c
  1020.  (\\*([D).
  1021. .if !"\\*([G"" Gov't. ordering no. \\*([G
  1022. .if !"\\*([O"" \\*([O
  1023. .)f
  1024. ..
  1025. .de [3                \" --- article in book
  1026. .(f
  1027. .ip "\\*([F.\0"
  1028. \\*([A, \\*(lq\\*([T,\\*(rq
  1029. .if !"\\*([P"" pp. \\*([P
  1030. in \\f2\\*([B\\f1, \c
  1031. .if !"\\*([E"" ed. \\*([E,\c
  1032. .if !"\\*([I"" \\*([I\c
  1033. .if !"\\*([C"" ,  \\*([C\c
  1034.  (\\*([D).
  1035. .if !"\\*([O"" \\*([O
  1036. .)f
  1037. ..
  1038. .de [4                \" --- report
  1039. .(f
  1040. .ip "\\*([F.\0"
  1041. \\*([A, \\*(lq\\*([T,\\*(rq
  1042. \\*([R\c
  1043. .if !"\\*([G"" \& (\\*([G)\c
  1044. .if !"\\*([I"" ,  \\*([I\c
  1045. .if !"\\*([C"" ,  \\*([C\c
  1046.  (\\*([D).
  1047. .if !"\\*([O"" \\*([O
  1048. .)f
  1049. ..
  1050. .de [5                \" --- tm style
  1051. .(f
  1052. .ip "\\*([F.\0"
  1053. \\*([A, \\f2\\*([T\\f1,
  1054. .ie \\n(TN \\*([M.
  1055. .el Bell Laboratories internal memorandum (\\*([D).
  1056. .)f
  1057. ..
  1058. .de ]<
  1059. .$p References
  1060. .lp
  1061. .rm (f )f
  1062. ..
  1063. .de ]>
  1064. .sp
  1065. ..
  1066. .de ]-
  1067. .rm [V [P [A [T [N [C [B [O [R [I [E [D
  1068. ..
  1069. .ie \n(.V<1v \
  1070. \{\
  1071. .    ds [. \s-2\v'-.4m'\f1
  1072. .    ds .] \v'.4m'\s+2\fP
  1073. .\}
  1074. .el \
  1075. \{\
  1076. .    ds [. " [
  1077. .    ds .] ]
  1078. .\}
  1079. .\"
  1080. .\"    IDEAL
  1081. .\"
  1082. .de IS            \" *** start ideal picture
  1083. .nr g7 \\n(.u
  1084. .ls 1
  1085. ..
  1086. .de IF
  1087. .if \\n(g7 .fi
  1088. .ls
  1089. ..
  1090. .de IE            \" *** end ideal picture
  1091. .if \\n(g7 .fi
  1092. .ls
  1093. ..
  1094. .\"
  1095. .\"    PIC
  1096. .\"
  1097. .de PS        \" *** start picture: $1=height, $2=width in units or inches
  1098. .sp 0.3
  1099. .nr g7 \\$2
  1100. .in (\\n(.lu-\\n(g7u)/2u
  1101. .ne \\$1u
  1102. .nr g7 \\n(.u
  1103. .ls 1
  1104. ..
  1105. .de PE            \" *** end picture
  1106. .ls
  1107. .in
  1108. .if \\n(g7 .fi
  1109. .sp .6
  1110. ..
  1111. .\"
  1112. .\"    GREMLIN
  1113. .\"
  1114. .de GS            \" *** start gremlin picture
  1115. .nr g7 (\\n(.lu-\\n(g1u)/2u
  1116. .if "\\$1"L" .nr g7 \\n(.iu
  1117. .if "\\$1"R" .nr g7 \\n(.lu-\\n(g1u
  1118. .in \\n(g7u
  1119. .nr g7 \\n(.u
  1120. .ls 1
  1121. .nf
  1122. .ne \\n(g2u
  1123. ..
  1124. .de GE            \" *** end gremlin picture
  1125. .GF
  1126. .sp .6
  1127. ..
  1128. .de GF            \" *** finish gremlin picture; stay at top
  1129. .ls
  1130. .in
  1131. .if \\n(g7 .fi
  1132. ..
  1133. .\"        *** FONT AIDS ***
  1134. .de sz            \" *** set point size and vertical spacing
  1135. .ps \\$1
  1136. .if \\n($r .@v
  1137. .vs \\n(.sp*\\n($vu/100u    \" default vs at pointsize + 20%
  1138. ..
  1139. .de @v            \" --- possibly set $v from $r
  1140. .if (1i>=240u)&(1p<=\\n($r)&(\\n($r<=4p) .nr $v \\n($r00/1p
  1141. ..
  1142. .de @V            \" --- possibly set $V from $R
  1143. .if (1i>=240u)&(1p<=\\n($R)&(\\n($R<=4p) .nr $V \\n($R00/1p
  1144. ..
  1145. .de @E            \" --- store in _F argument to \f for restoring font
  1146. .ie \\n(.f<10 \
  1147. .    ds _F \\n(.f
  1148. .el \
  1149. \{\
  1150. .    ie \\n(.f<100&\n(.g \
  1151. .        ds _F (\\n(.f
  1152. .    el \
  1153. .        ds _F P
  1154. .\}
  1155. ..
  1156. .de r            \" *** enter roman font
  1157. .@E
  1158. .ft 1
  1159. .if \\n(.$ \&\\$1\f\\*(_F\\$2
  1160. ..
  1161. .de i            \" *** enter italic
  1162. .@E
  1163. .ft 2
  1164. .if \\n(.$ \&\\$1\f\\*(_F\\$2
  1165. ..
  1166. .de b            \" *** enter boldface
  1167. .@E
  1168. .ft 3
  1169. .if \\n(.$ \&\\$1\f\\*(_F\\$2
  1170. ..
  1171. .de rb            \" *** enter real boldface
  1172. .@E
  1173. .ft 3
  1174. .if \\n(.$ \&\\$1\f\\*(_F\\$2
  1175. ..
  1176. .de bi            \" *** enter bold italic
  1177. .@E
  1178. .ft 4
  1179. .if \\n(.$ \&\\$1\f\\*(_F\\$2
  1180. ..
  1181. .de u            \" *** enter underlined word
  1182. \&\\$1\l'|0\(ul'\\$2
  1183. ..
  1184. .\" a better version of u
  1185. .if !\n(.g .ig
  1186. .de u
  1187. \Z'\\$1'\v'.25m'\D'l \w'\\$1'u 0'\v'-.25m'\\$2
  1188. ..
  1189. .de q            \" *** enter quoted word
  1190. \&\\*(lq\\$1\\*(rq\\$2
  1191. ..
  1192. .de bx            \" *** enter boxed word
  1193. \k~\(br\|\\$1\|\(br\l'|\\n~u\(rn'\l'|\\n~u\(ul'\^\\$2
  1194. ..
  1195. .de sm            \" *** print in smaller font
  1196. \s-1\\$1\\s0\\$2
  1197. ..
  1198. .de @F            \" --- change font (0 -> no change)
  1199. .nr ~ \\$1
  1200. .if \\n~>0 \
  1201. .    ft \\n~
  1202. .rr ~
  1203. ..
  1204. .\"        *** FOOTNOTING ***
  1205. .de (f            \" *** begin footnote
  1206. .ec
  1207. .if "\\n(.z"|f" .tm Line \\n(c. -- Illegal footnote nesting
  1208. .ie "\\n(.z"" \
  1209. \{\
  1210. .    nr _D \\n(dn
  1211. .    nr _0 1v+\\n(nlu
  1212. .    ev 2
  1213. .    da |f
  1214. .    in 0
  1215. .    xl \\n($lu-\\n(fuu
  1216. .    @F \\n(ff
  1217. .    sz \\n(fp
  1218. .    vs \\n(.sp*\\n($Vu/100u
  1219. .    if !\\n(?f \
  1220. \{\
  1221. .        nr _b +1v    \" allow space for $s
  1222. .        $s
  1223. .    \}
  1224. .    br
  1225. .    if \\n(.p-\\n(_b-\\n(_0-\\n(.h-1v-\\n(fs<0 \
  1226. \{\
  1227. .        da\"        \" won't fit on page at all
  1228. .        bc
  1229. .        if !\\n(?f \
  1230. .            rm |f
  1231. .        da |f
  1232. .\" next five lines could be dropped if headers had their own environment
  1233. .        in 0        \" reset everything from .bc
  1234. .        xl \\n($lu-\\n(fuu
  1235. .        @F \\n(ff
  1236. .        sz \\n(fp
  1237. .        vs \\n(.sp*\\n($Vu/100u
  1238. .        if !\\n(?f \
  1239. .            $s
  1240. .        br
  1241. .    \}
  1242. .    rr _0
  1243. .    sp \\n(fsu
  1244. .    nr ?f 1
  1245. .    fi
  1246. .    if !"\\$1"_" \
  1247. .        ti \\n(fiu
  1248. .    if \n@>2 .tm    << (f $f=\\n($f
  1249. .\}
  1250. .el \
  1251. \{\
  1252. .    ev 2
  1253. .    in 0
  1254. .    xl \\n($lu-\\n(fuu
  1255. .    @F \\n(ff
  1256. .    sz \\n(fp
  1257. .    vs \\n(.sp*\\n($Vu/100u
  1258. .    fi
  1259. \!.(f \\$1
  1260. \!.@N
  1261. .\}
  1262. ..
  1263. .de @N            \" --- set no fill mode in the top-level diversion
  1264. .ie "\\n(.z"" .nf
  1265. .el \!.@N
  1266. ..
  1267. .de )f            \" *** end footnote
  1268. .ie "\\n(.z"|f" \
  1269. \{\
  1270. .    if \\n* \
  1271. .        nr $f +1
  1272. .    ds * \\*{\\n($f\\*}\k*
  1273. .    nr * 0
  1274. .    in 0
  1275. .    da
  1276. .    ev
  1277. .    if \\n(_w<\\n(dl \
  1278. .        nr _w \\n(dl    \" compute maximum fn width
  1279. .    nr _b +\\n(dn
  1280. .    ch @f -\\n(_bu
  1281. .    if \\n(.p-\\n(_b<=\\n(nl \
  1282. .        ch @f \\n(nlu+\n(.Vu
  1283. .    nr dn \\n(_D
  1284. .    rr _D
  1285. .\}
  1286. .el \
  1287. \{\
  1288. .    br
  1289. \!.)f
  1290. .    ev
  1291. .\}
  1292. ..
  1293. .@R ff
  1294. .if \n(ff<=0 \
  1295. .    nr ff 1            \" footnote font: Times Roman
  1296. .@R fp
  1297. .if \n(fp<=0 \
  1298. .    nr fp 8            \" footnote pointsize
  1299. .de $s            \" $$$ footnote separator
  1300. \l'2i'
  1301. ..
  1302. .\"        *** DELAYED TEXT ***
  1303. .de (d            \" *** begin delayed text
  1304. .am |d )d
  1305. .sp \\n(bsu
  1306. ..
  1307. .de )d            \" *** end delayed text
  1308. .if \\n# \
  1309. .    nr $d +1
  1310. .ds # [\\n($d]\k#
  1311. .rr #
  1312. ..
  1313. .de pd            \" *** print delayed text
  1314. .|d
  1315. .rm |d
  1316. .nr $d 1 1
  1317. .ds # [1]\k#
  1318. ..
  1319. .\"        *** INDEXES (TABLE OF CONTENTS) ***
  1320. .nr _x 0 1
  1321. .af _x a
  1322. .de (x            \" *** begin index entry
  1323. .if \n@>4 .tm >> (x, .z=\\n(.z
  1324. .ds |X x
  1325. .if \\n(.$>0 \
  1326. .    ds |X \\$1
  1327. .ie "\\n(.z"" \
  1328. .    nr _z 0
  1329. .el \
  1330. .    nr _z 1
  1331. .@\\n(_z
  1332. ..
  1333. .de @0            \" --- finish (x if no current diversion
  1334. .am %\\*(|X )x
  1335. .sp \\n(xsu
  1336. .ti -\\n(piu
  1337. ..
  1338. .de @1            \" --- finish (x if current diversion
  1339. .if "\\n(_x"z" .nr _x 0
  1340. .de =\\n+(_x )x
  1341. ..
  1342. .de )x            \" *** end index entry
  1343. .if \n@>4 .tm >> )x, .z=\\n(.z
  1344. .ie "\\n(.z"" \
  1345. \{\
  1346. .    ds |x \\n%
  1347. .    if \\n(.$>0 \
  1348. .        ds |x \\$1
  1349. .    if "\\*(|x"_" \
  1350. .        ig ..
  1351. .    am %\\*(|X ..
  1352. .    if \w"\\$2">(\\n(.l-\\n(.i-\\n(.k) \
  1353. .        ti +\\n(xuu
  1354. \\\\a\\\\t\\$2\\*(|x
  1355. ...
  1356. .    rm |x
  1357. .    rm |X
  1358. .\}
  1359. .el \
  1360. \{\
  1361. \!.(x \\*(|X
  1362. \!\\\\*(=\\n(_x\\\\
  1363. \!.)x \\$1 \\$2
  1364. \!.rm =\\n(_x
  1365. .\}
  1366. ..
  1367. .de xp            \" *** print the index
  1368. .br
  1369. .@C 2
  1370. .ls 1
  1371. .vs \\n(.sp*\\n($Vu/100u
  1372. .fi
  1373. .in +\\n(piu
  1374. .ds |X x
  1375. .if \\n(.$>0 \
  1376. .    ds |X \\$1
  1377. .xl -(\\n(xuu+\w'...'u)
  1378. .di |x
  1379. .%\\*(|X
  1380. .br
  1381. .di
  1382. .rm %\\*(|X
  1383. .xl \\n($lu
  1384. .rm |X
  1385. .ev
  1386. .nf
  1387. .in 0
  1388. .ta \\n(.lu-\\n(xuuR \\n(.luR
  1389. .|x
  1390. .fi
  1391. .in
  1392. .rm |x
  1393. ..
  1394. .de +c            \" *** begin chapter
  1395. .ep                \" force out footnotes
  1396. .if \\n(?o:\\n(?a \
  1397. \{\
  1398. .    bp            \" force out a table or more footnote
  1399. .    rs
  1400. .    ep
  1401. .\}
  1402. .nr ?C 1
  1403. .nr $f 1 1
  1404. .ds * \\*{1\\*}\k*
  1405. .if \\n(?R \
  1406. .    pn 1
  1407. .bp
  1408. .in \\n($iu            \" reset the indent
  1409. .rs
  1410. .ie \\n(.$ \
  1411. .    $c "\\$1"
  1412. .el \
  1413. .    sp 3
  1414. ..
  1415. .de ++            \" *** declare chapter type
  1416. .nr _0 0
  1417. .if "\\$1"C" \
  1418. .    nr _0 1            \" chapter
  1419. .if "\\$1"RC" \
  1420. .    nr _0 11        \" renumbered chapter
  1421. .if "\\$1"A" \
  1422. .    nr _0 2            \" appendix
  1423. .if "\\$1"RA" \
  1424. .    nr _0 12        \" renumbered appendix
  1425. .if "\\$1"P" \
  1426. .    nr _0 3            \" preliminary material
  1427. .if "\\$1"B" \
  1428. .    nr _0 4            \" bibliographic material
  1429. .if "\\$1"AB" \
  1430. .    nr _0 5            \" abstract
  1431. .if \\n(_0=0 \
  1432. .    tm Line \\n(c. -- Bad mode to .++
  1433. .nr ?R 0
  1434. .if \\n(_0>10 \
  1435. .\{
  1436. .    nr ?R 1
  1437. .    nr _0 -10
  1438. .\}
  1439. .nr ch 0 1
  1440. .if (\\n(_0=3):(\\n(_0=5) \
  1441. .    pn 1            \" must do before .ep
  1442. .if !\\n(_0=\\n(_M .if \\n(_M=3 \
  1443. .    pn 1            \" must do before .ep
  1444. .ep                \" end page for correct page number types
  1445. .if \\n(_0=1 \
  1446. \{\
  1447. .    af ch 1
  1448. .    af % 1
  1449. .\}
  1450. .if \\n(_0=2 \
  1451. \{\
  1452. .    af ch A
  1453. .    af % 1
  1454. .\}
  1455. .if \\n(_0=3 \
  1456. .    af % i
  1457. .if \\n(_0=4 \
  1458. .    af % 1
  1459. .if \\n(_0=5 \
  1460. .    af % 1
  1461. .if \\n(.$>1 \
  1462. .    he \\$2
  1463. .nr _M \\n(_0
  1464. .rr _0
  1465. ..
  1466. .de $c            \" $$$ print chapter title
  1467. .sz 12
  1468. .ft 3
  1469. .ce 1000
  1470. .if \\n(_M<3 \
  1471. .    nr ch +1
  1472. .ie \\n(_M=1 CHAPTER\ \ \\n(ch
  1473. .el .if \\n(_M=2 APPENDIX\ \ \\n(ch
  1474. .if \w"\\$1" .sp 3-\\n(.L
  1475. .if \w"\\$1" \\$1
  1476. .if (\\n(_M<3):(\w"\\$1") \
  1477. .    sp 4-\\n(.L
  1478. .ce 0
  1479. .ft
  1480. .sz
  1481. .ie \\n(_M=1 \
  1482. .    $C Chapter \\n(ch "\\$1"
  1483. .el .if \\n(_M=2 \
  1484. .    $C Appendix \\n(ch "\\$1"
  1485. ..
  1486. .de tp            \" *** title page
  1487. .hx
  1488. .bp
  1489. .br
  1490. .rs
  1491. .pn \\n%
  1492. ..
  1493. .\"        *** DATES ***
  1494. .if \n(mo=1 .ds mo January
  1495. .if \n(mo=2 .ds mo February
  1496. .if \n(mo=3 .ds mo March
  1497. .if \n(mo=4 .ds mo April
  1498. .if \n(mo=5 .ds mo May
  1499. .if \n(mo=6 .ds mo June
  1500. .if \n(mo=7 .ds mo July
  1501. .if \n(mo=8 .ds mo August
  1502. .if \n(mo=9 .ds mo September
  1503. .if \n(mo=10 .ds mo October
  1504. .if \n(mo=11 .ds mo November
  1505. .if \n(mo=12 .ds mo December
  1506. .if \n(dw=1 .ds dw Sunday
  1507. .if \n(dw=2 .ds dw Monday
  1508. .if \n(dw=3 .ds dw Tuesday
  1509. .if \n(dw=4 .ds dw Wednesday
  1510. .if \n(dw=5 .ds dw Thursday
  1511. .if \n(dw=6 .ds dw Friday
  1512. .if \n(dw=7 .ds dw Saturday
  1513. .ds td \*(mo \n(dy, 19\n(yr
  1514. .\"        *** PARAMETRIC INITIALIZATIONS ***
  1515. .rr x
  1516. .nr $v \n(.v00+\n(.sp-1/\n(.sp    \" vs as percentage of ps for .sz request
  1517. .nr $V \n($v            \" same for displays & footnotes
  1518. .nr hm 4v            \" header margin
  1519. .nr tm 7v            \" top margin
  1520. .nr bm 6v            \" bottom margin
  1521. .nr fm 3v            \" footer margin
  1522. .nr tf 3            \" title font: (real) Times Bold
  1523. .nr tp 10            \" title point size
  1524. .hy 14
  1525. .nr bi 4m            \" indent for blocks
  1526. .nr pi 5n            \" indent for paragraphs
  1527. .nr pf 1            \" normal text font
  1528. .nr pp 10            \" normal text point size
  1529. .nr qi 4n            \" indent for quotes
  1530. .nr qp -1            \" down one point
  1531. .nr ii 5n            \" indent for .ip's and .np's
  1532. .nr $m 1            \" max number of columns
  1533. .nr $s 4n            \" column separation
  1534. .nr sf 3            \" section font -- Times Bold
  1535. .nr sp 10            \" section title pointsize
  1536. .nr ss 12p            \" section prespacing
  1537. .nr si 0            \" section indent
  1538. .\"        *** OTHER INITIALIZATION ***
  1539. .\" GNU pic sets this register to 1, to indicate that \x should not be used.
  1540. .@R 0x
  1541. .ds { \v'-0.4m'\x'\\n(0x=0*-0.2m'\s-3
  1542. .ds } \s0\v'0.4m'
  1543. .\" for compatibility with traditional -me
  1544. .\" (the first will work only in compatibility mode)
  1545. .ds [ \*{
  1546. .ds ] \*}
  1547. .ds < \v'0.4m'\x'\\n(0x=0*0.2m'\s-3
  1548. .ds > \s0\v'-0.4m'
  1549. .ds - \(em
  1550. .\" Avoid warnings from groff -ww.
  1551. .@S |0
  1552. .@S |1
  1553. .@S |2
  1554. .@S |3
  1555. .@S $H
  1556. .@S $0
  1557. .@S $1
  1558. .@S $2
  1559. .@S $3
  1560. .@S $4
  1561. .@S $5
  1562. .@S $6
  1563. .@S $7
  1564. .@S $8
  1565. .@S $9
  1566. .@S ..
  1567. .@R po\"            \" simulated page offset
  1568. .@R $0\"            \" section depth
  1569. .@R $i\"            \" paragraph base indent
  1570. .@R $p\"            \" numbered paragraph number
  1571. .@R $r\"            \" ratio of vs to ps (may override $v)
  1572. .@R $R\"            \" same for displays (may override $V)
  1573. .@R df\"            \" display font: same as surrounding text
  1574. .@R so\"            \" additional section title offset
  1575. .@R fu\"            \" footnote undent
  1576. .@R bt\"            \" block keep threshold
  1577. .@R *\"                \" has \** been referenced?
  1578. .@R ?a\"            \" pending floating keep at page top?
  1579. .@R ?b\"            \" pending floating keep at page bottom?
  1580. .@R ?C\"            \" at chapter header?
  1581. .@R ?e\"            \" in equation?
  1582. .@R ?H\"            \" suppress headers and footers next page?
  1583. .@R ?I\"            \" has the header trap been sprung?
  1584. .@R ?n\"            \" n1 mode?
  1585. .@R ?o\"            \" footnote overflow?
  1586. .@R ?R\"            \" renumbered chapter?
  1587. .@R ?s\"            \" skip next page?
  1588. .@R ?T\"            \" inside .TS H?
  1589. .@R ?W\"            \" wide floating keep at page bottom?
  1590. .@R ?w\"            \" wide floating keep at page top?
  1591. .nr fi 0.3i
  1592. .nr _o \n(.o
  1593. .nr $b 3            \" bold
  1594. .nr ps 0.35v
  1595. .if \n(ps<\n(.V .nr ps \n(.V
  1596. .nr bs \n(ps            \" block pre/post spacing
  1597. .nr qs \n(ps            \" quote pre/post spacing
  1598. .nr zs 1v            \" float-block pre/postspacing
  1599. .nr xs 0.2v            \" index prespacing
  1600. .nr xu 0.5i            \" index undent
  1601. .nr fs 0.2v            \" footnote prespacing
  1602. .nr es 0.5v            \" equation pre/postspacing
  1603. .if \n(es<\n(.V .nr es \n(.V
  1604. .wh 0 @h            \" set header
  1605. .nr $l \n(.lu            \" line length
  1606. .nr _L \n(.lu            \" line length of page
  1607. .nr $c 1            \" current column number
  1608. .nr $f 1 1            \" footnote number
  1609. .ds * \*{1\*}\k*\"        \" footnote "name"
  1610. .nr $d 1 1            \" delayed text number
  1611. .ds # [1]\k#\"            \" delayed text "name"
  1612. .nr _M 1            \" chapter mode is chapter
  1613. .ds lq \(lq\"            \" left quote
  1614. .ds rq \(rq\"            \" right quote
  1615. .em @z
  1616. .\"        *** FOREIGN LETTERS AND SPECIAL CHARACTERS ***
  1617. .ds #h ((1u-(\\\\n(.fu%2u))*0.13m)
  1618. .ds #v 0.6m
  1619. .\"            \" accents
  1620. .ds ' \k_\h'-(\\n(.wu*8/10-\*(#h)'\(aa\h'|\\n_u'
  1621. .ds ` \k_\h'-(\\n(.wu*7/10-\*(#h)'\(ga\h'|\\n_u'
  1622. .\"            \" umlaut
  1623. .ds : \k_\h'-(\\n(.wu*8/10-\*(#h+0.1m)'\v'-\*(#v'\z.\h'0.2m'.\h'|\\n_u'\v'\*(#v'
  1624. .\"            \" circumflex and tilde
  1625. .ds ^ \k_\h'-(\\n(.wu-\*(#h-0.05m)'^\h'|\\n_u'
  1626. .ds ~ \k_\h'-(\\n(.wu-\*(#h-0.05m)'~\h'|\\n_u'
  1627. .\"            \" cedilla and czech
  1628. .ds , \k_\h'-(\\n(.wu)',\h'|\\n_u'
  1629. .ds v \k_\h'-(\\n(.wu*9/10-\*(#h)'\v'-\*(#v'\s-4v\s0\v'\*(#v'\h'|\\n_u'
  1630. .\"            \" Norwegian A or angstrom
  1631. .ds o \k_\h'-(\\n(.wu+\w'\(de'u-\*(#h)/2u'\v'-0.4n'\z\(de\v'0.4n'\h'|\\n_u'
  1632. .\"            \" there exists, for all
  1633. .ds qe \s-2\v'0.45m'\z\(em\v'-0.625m'\z\(em\v'-0.625m'\(em\v'0.8m'\s0\h'-0.1m'\v'-0.05m'\(br\v'0.05m'\h'0.1m'
  1634. .ds qa \z\e\h'0.35m'\z\(sl\h'-0.33m'\v'-0.3m'\s-4\(em\s0\v'0.3m'\h'0.15m'
  1635. .rm #h #v
  1636. .ll 6.0i
  1637. .lt 6.0i
  1638. .de @U
  1639. .tm The \\$1 macro has been removed from this version of the -me macros.
  1640. ..
  1641. .de lo
  1642. .@U lo
  1643. ..
  1644. .de th
  1645. .@U th
  1646. ..
  1647. .de ac
  1648. .@U ac
  1649. ..
  1650.